| TOP | スクリプト解説 | リンク | ご意見板 |


98Like!別館
その他の小技1(点数加算とクリア判定をしちゃおう)♪
98Like!本館はコチラ




さあ、今回は点数加算とそれに絡む画面表示・面クリアの判定とそれに絡む画面表示を説明致します。って言っても、ほんの小技程度の簡単な物ですけど♪


まず
『*SYOKIKA』の所に点数関係とクリア判定の関係の変数を設定します。特に難しい事は無いのですが、1つ注意事項を・・・
今回から面の開始やゲームオーバー等の時に画面にメッセージの表示を行うようにしますが、この時使う変数は当然メッセージが入りますので文字列型の変数になります。後に出てきますが、今回は変数『a』と『b』を使って文字列の加算を行っています。この時、変数『a』は代入式であらかじめ文字列が代入されるので必然的に文字列型の変数になります。しかし、変数『b』は文字列型の『a』との加算式の中で出てきますので、あらかじめ文字列型の変数に指定してやらないと数値型の変数として扱われてしまいます。そこで『*YOKIKA』の部分で、あらかじめ文字列型の変数として定義します。
今回は30文字までの文字列型変数に設定しましたが、文字数は適当でかまいません。必要数で初期化して下さい。

次に
『*MAIN』メインルーチンですが、ココにまたも1つサブルーチン『goto *CLEAR』を追加します。今回のサブルーチンは、条件分岐で面クリアのフラッグが立っている時だけ、そのルーチンに飛びます。

さあ、
『*TEKIMOVE』ここで今回のゲームは面クリア判定をします。
まず、クリアチェック変数『
cc=0』を初期化します。次に敵が画面上に存在しない時この変数を加算して行きます。『if ef.cnt<1 : cc+ : continue
今回は固定画面制のゲームなので、出現する敵の数が決まっている(本ゲームでは12機)ので、この変数『
cc』が12になった時、全ての敵が画面上から消えたと言う事になります。つまり、これがクリアしたと言う事になります。更に今回はステージの概念を導入する為に、クリアした時に『lv=2』レベルが2なら次のステージに飛び、それ以外(レベル1の時)はレベルだけ加算して出現する敵だけを変更しています。
但し、今回ステージは変わりません・・・・(^^;

次に
『*TEKIMOVE』『TAMAMOVE』『UFO』の各々当たり判定の場所でスコア加算を行います。ここは単純な加算なので特に説明する事は有りません。

次に
『*MESSAGEの所でスコアとハイスコアの表示を行います。ついでにステージスタート時のメッセージも、ココで設定しましょう♪

さて、次に前回『
end』のみで放置した『*GAMEOVER』ココも、少し手を加えて見ましょう。って言っても、今回は単に『Game Over』という文字が左から順次ゆっくり表示されるだけですけど・・・。『if gcnt\12<1』この部分を変える事によって、表示速度を早くも遅くも出来ます。

最後に
『*CLEAR』ですが、これも『*GAMEOVER』と同様メッセージの表示だけです。



一応、今回で予定していたスクリプト解説は終わりなのですが、多少でもお役に立てましたでしょうか!?
折角1・2面が出来たので、ボチボチ続きも作り続けたいと思います。機会を見スクリプト解説に追加したいと思いますので、お楽しみに☆
尚、分かりにくい場所があれば、掲示板やメールにてご質問下さい m(_ _)m
下記のスクリプトの一部または全部において転用は自由とさせていただきますので、色々と数字を換えてお試し下さい♪
下記スクリプトをHSPのスクリプトエディターにコピペでお使いいただけます。



 

   
	#define SHOTMAX 2			;自機弾最大数
	#define ENEMYMAX 12			;敵機最大数
	#define TAMAMAX 36			;敵弾最大数
	#define HOSIMAX 100			;流星最大数

	buffer 3,,,1
	picload "bomb1.bmp"
	buffer 2,,,1 
	picload "cruiser.bmp"
	screen 0,640,480,1,dispx-640/2,dispy-480/2:cls 4 : title "space cruiser" 
	font "MS 明朝",20,1
	gmode 2


*SYOKIKA 
	mx=300 : my=400			;自機の初期位置 
	lv=0				;初期レベル
	myl=1				;自機生存の有無
	uf=10				;UFO生存の有無(UFOの硬さも表現しています)
	ux=160 : uy=60			;UFOの初期位置
	usx=6				;UFOの移動初速度(X軸)
	usy=8				;UFOの移動初速度(Y軸)
	us=1				;UFOの加速量
	utsx=30				;UFO弾の移動初速度(X軸)
	utsy=6				;UFO弾の移動初速度(Y軸)
	gcnt=1				;ゲームカウンターの初期値
	ml=3				;初期の自機数
	sc=0				;ゲームのスコア
	cc=0				;クリアチェック
	cl=1				;クリアフラッグ
	mno=0				;メッセージナンバー
	enemy=0				;敵生存の有無

	sdim b,30				;文字列変数設定(最大30文字)

	dim sf,SHOTMAX			;自弾の有無 
	dim sx,SHOTMAX			;自弾のX座標 
	dim sy,SHOTMAX			;自弾のY座標 

	dim ef,ENEMYMAX			;敵の硬さ
	dim ex,ENEMYMAX			;敵のX座標
	dim ey,ENEMYMAX			;敵のY座標
	dim et,ENEMYMAX			;敵発生からのカウンター
	dim esx,ENEMYMAX			;敵のX軸移動量
	dim esy,ENEMYMAX			;敵のY軸移動量

	dim tf,TAMAMAX			;敵弾の有無
	dim tx,TAMAMAX			;敵弾のX座標
	dim ty,TAMAMAX			;敵弾のY座標
	dim tk,TAMAMAX			;敵弾の種類(垂直OR斜頚)
	dim td,TAMAMAX			;敵弾の弾道(方向)
	dim ts,TAMAMAX			;敵弾の移動速度

	dim hx,HOSIMAX			;星のX軸座標
	dim hy,HOSIMAX			;星のY軸座標
	dim hc,HOSIMAX			;星の色
	dim hcr,HOSIMAX			;星の色(赤)
	dim hcg,HOSIMAX			;星の色(緑)
	dim hcb,HOSIMAX			;星の色(青)
	dim hs,HOSIMAX			;星の移動速度

	repeat HOSIMAX
		rnd hx.cnt,640
		rnd hy.cnt,480
		rnd hcr.cnt,2
		rnd hcg.cnt,2
		rnd hcb.cnt,2
		rnd hs.cnt,5 : if hs.cnt=0 : hs.cnt=5
		hcr.cnt=hcr.cnt*255
		hcg.cnt=hcg.cnt*255
		hcb.cnt=hcb.cnt*255
	loop


*MAIN					;メインループ 
	palcolor 0 : boxf 0,0,640,480
	if cl>0 : goto *CLEAR
	gosub *HAIKEI
	gosub *MESSAGE 
	if myl>0 : gosub *JIKI 
	gosub *TAMA
	if enemy=0 : gosub *TEKI
	gosub *TEKIMOVE
	gosub *TAMAMOVE
	gosub *UFO
	gosub *UFOTAMA
	redraw 1 : redraw 2 : await 30
	gcnt+
	if gres=0 : goto *MAIN
	gwt+
	if gwt<100 : goto *MAIN
	myl=1 : gwt=0 : gres=0 : mx=300 : my=400 : sf=0 : ff=0
	repeat TAMAMAX : tf.cnt=0 : loop
	if ml<1 : goto *GAMEOVER
	goto *MAIN 

 
*JIKI					;自機の移動・ショットキーチェック 
	stick bt,5 : k- : if k<1 : if bt&16 : ff=1 : k=3 
	mxv=(bt&4!0):mxv-=(bt&1!0) 
	mx+=mxv*8 
	if mx<0 : mx=0 
	if mx>580 : mx=580 
	pos mx,my : gcopy 2,0,32,64,64 
	return 

 
*TAMA					;自機弾の移動・表示
	repeat SHOTMAX 
	if ff>0 : if sf.cnt=0 : ff- : sf.cnt=1 : sx.cnt=mx+16 : sy.cnt=my-20 
	if sf.cnt=0 : continue 
	sy.cnt-=12 : if sy.cnt<-32 : sf.cnt=0 
	pos sx.cnt,sy.cnt : gcopy 2,96,0,32,32 
	loop 
	return

*TEKI					;敵の出現
	repeat ENEMYMAX
	if cnt<12	{
	if cnt<10	{
	if cnt<8	{
	if cnt<6	{
	if cnt<4	{
	if cnt<2	{	ef.cnt=1 : ex.cnt=cnt*100+100 : ey.cnt=80
			pos ex.cnt,ey.cnt : gcopy 2,lv*32,0,32,32
		}else{	ef.cnt=1 : ex.cnt=cnt-2*100+100 : ey.cnt=130
			pos ex.cnt,ey.cnt : gcopy 2,lv*32,0,32,32	}
		}else{	ef.cnt=1 : ex.cnt=cnt-4*100+100 : ey.cnt=180
			pos ex.cnt,ey.cnt : gcopy 2,lv*32,0,32,32	}
		}else{	ef.cnt=1 : ex.cnt=cnt-5*100+300 : ey.cnt=80
			pos ex.cnt,ey.cnt : gcopy 2,lv*32,0,32,32	}
		}else{	ef.cnt=1 : ex.cnt=cnt-7*100+300 : ey.cnt=130
			pos ex.cnt,ey.cnt : gcopy 2,lv*32,0,32,32	}
		}else{	ef.cnt=1 : ex.cnt=cnt-9*100+300 : ey.cnt=180
			pos ex.cnt,ey.cnt : gcopy 2,lv*32,0,32,32	}
		} 
		esx.cnt=5 : esy.cnt=5 : et.cnt=0
		enemy=1
	loop
return

*TEKIMOVE					;敵の移動処理・当たり判定
	cc=0
	repeat ENEMYMAX
	if ef.cnt<1 : cc+ : continue
	et.cnt++
	if cnt<6 {
		ex.cnt-=esx.cnt : if et.cnt>20 : et.cnt=-20 : esx.cnt=-esx.cnt
		ey.cnt+=esy.cnt : if (ey.cnt>200)|(ey.cnt<50) : esy.cnt=-esy.cnt
	}else{
		ex.cnt+=esx.cnt : if et.cnt>20 : et.cnt=-20 : esx.cnt=-esx.cnt
		ey.cnt+=esy.cnt : if (ey.cnt>200)|(ey.cnt<50) : esy.cnt=-esy.cnt
	}
	ent=cnt
		repeat SHOTMAX
		if sf.cnt=0 : continue
		dx=(ex.ent+16)-(sx.cnt+16) : if dx<0 : dx=-dx
		dy=(ey.ent+16)-(sy.cnt+16) : if dy<0 : dy=-dy
		if dx<10 : if dy<10 {
		ef.ent- : sf.cnt- : pos ex.ent,ey.ent : sc+=lv*50
		palcolor 255 : mes "●"
		}
		loop
		rnd tam,200 : if tam=0 {
		repeat TAMAMAX
		if tf.cnt>0 : continue
		tf.cnt+ : tx.cnt=ex.ent : ty.cnt=ey.ent
		rnd ts.cnt,5 : ts.cnt+=5
		rnd tk.cnt,3 : if tk.cnt=0 : tk.cnt=1
		dx=ex.ent-mx : if dx<0 : td.cnt=-3 : else : td.cnt=3
		break
		loop
		}
	pos ex.cnt,ey.cnt : gcopy 2,lv*32,0,32,32
	loop
	if cc=12 { 
		if lv=2 {
				cl+ : enemy=0 : gcnt=1
			} else {
				lv+ : enemy=0 : gcnt=1
			}
		}
return

*TAMAMOVE					;敵弾の移動&当たり判定
	repeat TAMAMAX
	if tf.cnt<1 : continue
	if tk.cnt=1 : ty.cnt+=ts.cnt : else : ty.cnt+=ts.cnt : tx.cnt-=td.cnt
	if ty.cnt>480 : tf.cnt-
	ent=cnt
		repeat SHOTMAX
			if sf.cnt=0 : continue
			dx=(tx.ent+16)-(sx.cnt+16) : if dx<0 : dx=-dx
			dy=(ty.ent+16)-(sy.cnt+16) : if dy<0 : dy=-dy
			if dx<5 : if dy<10 {
			tf.ent- : sf.cnt- : pos sx.cnt,sy.cnt : sc+=10
			palcolor 255 : mes "●"
			}
		loop
		if myl<1 : continue
		dx=(tx.cnt+16)-(mx+32) : if dx<0 : dx=-dx
		dy=(ty.cnt+16)-(my+32) : if dy<0 : dy=-dy
		if dx<20 : if dy<30 {
		tf.cnt- : myl- : ml- : gres+ : mmf=20 : gosub *MESSAGEBORN
		}
	pos tx.cnt,ty.cnt : gcopy 2,128,0,32,32
	loop
return

*UFO					;UFO移動&当たり判定
	if uf<1 : return
	ux+=usx : uy-=usy
	if (usy<-10)|(usy>10) : us=-us
	usy-=us
	if (ux<160)|(ux>400) : usx=-usx
		repeat SHOTMAX
			if sf.cnt=0 : continue
			dx=(ux+48)-(sx.cnt+16) : if dx<0 : dx=-dx
			dy=(uy+16)-(sy.cnt+16) : if dy<0 : dy=-dy
			if dx<20 : if dy<10 {
			uf- : sf.cnt- : pos sx.cnt,sy.cnt : palcolor 255 : mes "●"
			if uf<1 : sc+=1000
			}
		loop
	pos ux,uy : gcopy 2,64,(ufn+1)*32,96,32
	if gcnt\20<1 : ufn=ufn+1\2
	if gcnt\300<1 : if myl>0 {
			utf+ : utx=ux+48 : uty=uy+16 : if ux>300 : utsx=-utsx
			}
return

*UFOTAMA					;UFOの弾移動&当たり判定
	if utf<1 : return
	utx+=utsx : uty+=utsy
	if uty>300 { if utx<200 : utsx+=10
			if utx>400 : utsx-=10
		} else {
			if utx<250 : utsx+=8
		if utx>350 : utsx-=8
		}
	if uty>480 : utf- : utsx=30
	if myl>0 {
		dx=(utx+32)-(mx+32) : if dx<0 : dx=-dx
		dy=(uty+32)-(my+32) : if dy<0 : dy=-dy
		if dx<20 : if dy<30 {
			utf- : myl- : utsx=30
			ml- : gres+ : mmf=20 : gosub *MESSAGEBORN
			}
		}
	pos utx,uty : gcopy 2,0,0,32,32
return

*MESSAGEBORN				;メッセージ発生処理(爆風発生処理)
		px=mx : py=my
return


*MESSAGE					;画面メッセージ&爆風の表示
	pos 0,457 : gzoom 32,32,2,0,32,64,96 : palcolor 255 : pos 30,458 : mes ml
	palcolor 150 : pos 20,5 : mes "SCORE "+sc
	palcolor 250 : pos 280,5 : mes "HISCORE "+hsc
	
	if mmf>0 {
		pos px,py : gcopy 3,mybomx*96,mybomy*96,96,96
		mybomx=mybomx+1\8
		if mybomx=7 : mybomy=1
		mmf--
		}
		
	if lv=0 : m=" UFO's   FOUND "
	if lv=2 : m="ASTEROIDS  ZONE"
return


*GAMEOVER					;ゲームオーバー
	redraw 1,280,190,90,20
	m="Game Over"
	palcolor 255
	repeat
	if gcnt\12<1 {
	strlen x,m
	if x>mno : strmid a,m,mno,1 : b+=a : mno+ : if a!" "
	}
	pos 320-(x*5),200 : mes b
	stick bt : if bt&32 {
				if hsc<sc {
						hsc=sc : goto *SYOKIKA
					} else {
						goto *SYOKIKA
					}
				}
	gcnt+
	await 1
	loop
	
*HAIKEI					;背景(星)描画
	repeat HOSIMAX
		color hcr.cnt,hcg.cnt,hcb.cnt
		hy.cnt=hy.cnt+hs.cnt
		if hy.cnt>480 : hy.cnt=0 : rnd hx.cnt,640
		pset hx.cnt,hy.cnt
	loop
	if (lv=1)|(lv=2) {
	wakux=400 : wakuy++
	if wakuy>1280 : wakuy=-96
	pos wakux,wakuy : gcopy 2,160,0,96,96
	}
return

*CLEAR					;クリア時のメッセージ表示
	palcolor 0 : boxf 0,0,640,480
	gosub *HAIKEI
	gosub *MESSAGE
	gosub *JIKI
	gosub *TAMA
	if gcnt>100 {
		cl- : gcnt=1 : lv+ : x=0 : mno=0 : b=""
		if lv>2 {
				if hsc<sc {
						hsc=sc : goto *SYOKIKA
					} else {
						goto *SYOKIKA
					}
			}
		goto *MAIN
		}
	if gcnt\3<1 {
	strlen x,m
	if x>mno : strmid a,m,mno,1 : b+=a : mno+ : if a!" "
	}
	pos 320-(x*5),200 : palcolor 255 : mes b
	gcnt+
	redraw 1 : redraw 2 : await 30
	goto *CLEAR
		


↑スコア&ハイスコアと画面メッセージを追加♪
簡単な面要素を導入してみました(^^);


上手く出来たら、次に行ってみましょう♪

NEXT ->>


管理人 : よっしー

楽天モバイル[UNLIMITが今なら1円] ECナビでポインと Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!


無料ホームページ 無料のクレジットカード 海外格安航空券 解約手数料0円【あしたでんき】 海外旅行保険が無料! 海外ホテル